/*
 * process.h
 */

#ifndef PROCESS_H_
#define PROCESS_H_

#define MAX_PROCESS 16
#define MAX_ARGS	5

typedef enum {FREE, READY, RUNNING, BLOCKED, FINISHED} statusT;
typedef enum {BACKGROUND, FOREGROUND} placeT;

/* Estructura que contiene los campos necesarios que definen el contexto de un
 * proceso.*/
typedef struct
{
	int EDI, ESI, EBP, ESP, EBX, EDX, ECX, EAX, EIP, CS, EFLAGS;
	void * retaddr;
	int argc;
	int ptrargv;
} tContext;

/* Estructura que contiene los campos necesarios que definen a un proceso.*/
typedef struct
{
	unsigned char * esp;
	char name[100];
	int pid;
	int ppid;
	int stacksize;
	int stackstart;
	int priority;
	int timesCalled;
	int attachedTTY;
	placeT place;

} tProcess;

/* Estructura que contiene infromación sobre un determinado proceso.*/
typedef struct
{
	statusT status;
	tProcess ps;
} tPslot;


/* Función para inicializar los procesos.*/
void initProcesses(void);


/* Función que crea los procesos.*/
int CreateProcess (char* name, int (*process) (int, char **), int argc, char ** argv, int priority, placeT place, int tty);


/* Función que retorna la cantidad procesos.*/
int GetProcessQtty(void);


/* Función que retorna el próximo pid que esté libre para ser utilizado.*/
int GetNextPID();


/* Función que libera los recursos utilizados por un proceso.*/
void Destroy(int pid);


/* Función para establecer una determinada prioridad a un proceso.*/
int setPriority(int pid, int priority);

#endif /* PROCESS_H_ */
